class Solution {
    public int maxUncrossedLines(int[] nums1, int[] nums2) {
        // 和 最长公共子序列的 写法是一致的
        // 创建dp表、初始化、填表、返回值
        int m = nums1.length, n = nums2.length;
        int[][] dp = new int[m+1][n+1]; // 多申请一行与一列

        // 默认为0，无需手动初始化

        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                if (nums1[i-1] == nums2[j-1]) {
                    dp[i][j] = dp[i-1][j-1] + 1;
                } else {
                    dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);
                }
            }
        }

        return dp[m][n];
    }
}